#ifndef __INTERACTION_MANAGER_H__
#define __INTERACTION_MANAGER_H__

#include "uc_coding.h"

/**
 *
 * @brief 网络头结构体
 *
 */
typedef struct
{
    unsigned int req_num;    /**< 请求计数 */
    unsigned short cmd;      /**< 命令 */
    unsigned short dest_num; /**< 目标地址数量 */
    unsigned int *dest_addr; /**< 目标地址列表 */
    unsigned int src_addr;   /**< 源地址 */
    unsigned int wiota_addr; /**< WIoTa 地址 */
} net_head_t;

/**
 * @brief 网络发送结果结果枚举
 *
 */
typedef enum
{
    NET_SEND_SUC = 0, /**< 发送成功 */
    NET_SEND_FAIL,    /**< 发送失败 */
    NET_CONNECT_FAIL  /**< 网络未连接 */
} net_send_result_e;

// 网络发送结果回调函数指针定义
typedef void (*net_msg_exec_result)(void *buf, net_send_result_e state);

/**
 * @brief 网关管理线程发送到NET APP线程的用户透传数据结构体
 *
 */
typedef struct
{
    net_head_t head;                     /**< 网关管理线程和NET APP线程交互的头 */
    net_msg_exec_result result_function; /**< 发送结果执行回调 */
    char fmt[8];                         /**< 数据编码类型，见uc_up_encode_e */
    int data_len;                        /**< 数据长度 */
    char data[0];                        /**< 数据 */
} mng_ul_userdata_t;

/**
 * @brief 网关线程发送到NET APP线程的IoTE状态更新信息结构体
 *
 */
typedef struct
{
    net_head_t head;                  /**< 网关管理线程和NET APP线程交互的头 */
    app_ps_iote_state_update_t state; /**< IoTE状态信息 */
} mng_ul_iote_state_t;

/**
 * @brief 服务器主动查询终端版本号的响应消息结构体
 *
 */
typedef struct
{
    net_head_t head;                /**< 网关管理线程和NET APP线程交互的头 */
    app_ps_iote_version_t iote_ver; /**< IoTE当前版本信息 */
} mng_ul_iote_version_t;

/**
 * @brief 网关线程发送到NET APP线程的IoTE版本验证信息结构体
 *
 */
typedef struct
{
    net_head_t head;                  /**< 网关管理线程和NET APP线程交互的头 */
    app_ps_version_verify_t ver_info; /**< IoTE版本验证信息 */
} mng_ul_version_verify_t;

/**
 * @brief NET APP线程发送到网关管理线程的用户透传数据结构体
 *
 */
typedef struct
{
    net_head_t head;             /**< 网关管理线程和NET APP线程交互的头 */
    char fmt[8];                 /**< 数据编码类型，见uc_up_encode_e */
    unsigned int send_delay;     /**< 发送延时，paging tx 携带广播数据时有效 */
    unsigned int order_business; /**< 顺序发送业务 */
    char *unicast_data;          /**< 单播数据 */
    unsigned int unicast_len;    /**< 单播数据长度 */
    char *broadcast_data;        /**< 广播数据 */
    unsigned int broadcast_len;  /**< 广播数据长度 */
} net_dl_userdata_t;

/**
 * @brief NET APP线程发送到485线程的透传数据结构体
 *
 */
typedef struct
{
    unsigned short cmd;                /**< 命令 */
    unsigned int src_addr;             /**< 源地址 */
    unsigned int dest_addr;            /**< 目标地址 */
    char fmt[8];                       /**< 数据编码类型，见uc_up_encode_e */
    unsigned int send_delay;           /**< 发送延时，paging tx 携带广播数据时有效 */
    char *transparent_data;            /**< 透传数据 */
    unsigned int transparent_data_len; /**< 透传数据长度 */
} net_dl_transparent_data_t;

typedef struct
{
    unsigned short cmd;  /**< 命令 */
    unsigned int dev_id; /**< 设备地址 */
    unsigned int status; /**< 设备状态 */
} mng_ul_device_status_t;

/**
 * @brief 单个终端的信息
 *
 */
typedef struct
{
    unsigned char dev_id_key[12]; /**< 设备地址，作为key值 */
    unsigned char info_str[36];   /** "wiota_id", pos "burst_idx" "slot_idx" , ts "slot_idx" "ts_fn" */
} auth_info_t;

/**
 * @brief 鉴权列表信息
 *
 */
typedef struct
{
    unsigned int auth_total_num; /** 授权设备总数 */
    auth_info_t *auth_info;      /** 授权设备信息 */
} gw_auth_list_info_t;

/**
 * @brief 网关扫描频段请求消息结构体
 *
 */
typedef struct
{
    unsigned int scan_times;   /** 扫描次数 */
    unsigned int scaned_times; /** 当前已扫频的次数 */
    unsigned int freq_num;     /** 频点数量 */
    unsigned char *freq_list;  /** 频点列表 */
} gw_scan_freq_req_t;

/**
 * @brief 单个终端的信息
 *
 */
typedef struct
{
    unsigned char freq_key[4];  /**< 频点，作为key值 */
    unsigned char info_str[36]; /** 比如："160": "rssi -80, snr 20, is_synced 1" */
} scan_result_t;

/**
 * @brief 网关扫描频段响应消息结构体
 *
 */
typedef struct
{
    unsigned char result[4];   /** 扫描结果，suc or fail */
    unsigned int scaned_times; /** 当前已扫频的次数 */
    unsigned int scan_res_num; /** 扫描结果数量 */
    scan_result_t *scan_res;   /** 扫描结果信息 */
} gw_scan_freq_resp_t;

/**
 * @brief IoTE状态更新信息释放
 *
 * @param state IoTE状态更新信息结构体指针
 */
void mng_ul_iote_state_free(mng_ul_iote_state_t *state);

/**
 * @brief 用户上行透传数据释放
 *
 * @param user_data 用户上行数据结构体指针
 */
void mng_ul_userdata_free(mng_ul_userdata_t *user_data);

/**
 * @brief 网络下行透传数据释放
 *
 * @param net_data 网络下行透传数据指针
 */
void net_dl_userdata_free(net_dl_userdata_t *net_data);

/**
 * @brief 485透传数据释放
 *
 * @param net_data 485透传数据指针
 */
void net_dl_transparent_data_free(net_dl_transparent_data_t *net_data);

// 执行结果回调函数指针定义
typedef void (*wiota_msg_exec_result)(void *data);

/**
 * @brief 网关管理线程发送到WIoTa APP线程执行结果枚举
 *
 */
typedef enum
{
    WIOTA_SEND_DEFAULT = 0, /**< 默认结果 */
    WIOTA_SEND_SUCCESS,     /**< 发送成功 */
    WIOTA_SEND_FAIL         /**< 发送失败 */
} wiota_send_result_e;

/**
 * @brief 网关管理线程发送到WIoTa APP的数据头结构体
 *
 */
typedef struct
{
    unsigned int src_address;              /**< 源地址，一般为网关默认地址 */
    unsigned int id;                       /** IoTE的设备id */
    wiota_send_result_e result;            /** 发送结果 */
    wiota_msg_exec_result result_function; /** 发送结果执行回调 */
    unsigned int cmd;                      /** 命令 */
    unsigned int send_counter;             /** 发送次数 */
} wiota_head_t;

/**
 * @brief 网关管理线程发送到WIoTa APP的数据结构体
 *
 */
typedef struct
{
    unsigned short src_module;   /**< 源模块 */
    unsigned char na[2];         /**< 对齐预留位 */
    wiota_head_t head;           /**< 网关管理线程发送到WIoTa APP的数据头 */
    void *data;                  /**< 数据 */
    unsigned int data_len;       /**< 数据长度 */
    unsigned int data_idx;       /**< 数据管理下标 */
    unsigned int data_tick;      /**< 数据生成的时间 */
    unsigned int data_cnt;       /**< 数据计数 */
    unsigned int order_business; /**< 为了解决多终端集中下行后上行的冲突新增的解决方案，具体见api参数描述 */
} mng_to_wiota_data_t;

/**
 * @brief WIoTa APP线程发送到网关管理线程的数据结构体
 *
 */
typedef struct
{
    unsigned int id;         /** IoTE的user id */
    unsigned short data_len; /** 数据长度 */
    unsigned char delay;     /** IoTE接入delay，该值与IoTE和AP的距离有关，当data_type为0时有效 */
    unsigned char data_type; /** 数据类型uc_recv_data_type_e*/
    char *data;              /** 数据 */
} wiota_to_mng_data_t;

/**
 * @brief 发送命令和数据到WIoTa APP线程
 *
 * @param module         源线程模块
 * @param cmd            WIoTa APP命令
 * @param order_business 顺序发送业务
 * @param src_address    源地址（网关默认地址）
 * @param dest_address   要发送目标IoTE的设备地址
 * @param data           发送数据指针
 * @param data_len       发送数据长度
 * @param func           发送结果回调
 * @return int           0表示成功，非0表示失败
 */
int manager_send_to_wiota(int module,
                          unsigned int cmd,
                          unsigned int order_business,
                          unsigned int src_address,
                          unsigned int dest_address,
                          void *data,
                          int data_len,
                          wiota_msg_exec_result func);

/**
 * @brief 网关管理线程到WIoTa APP线程数据释放
 *
 * @param to_wiota_data 网关管理线程到WIoTa APP线程数据结构体指针
 */
void manager_to_wiota_data_free(mng_to_wiota_data_t *to_wiota_data);

/**
 * @brief WIoTa APP线程到网关管理线程数据释放
 *
 * @param to_mng_data WIoTa APP线程到网关管理线程数据结构体指针
 */
void wiota_to_manager_data_free(wiota_to_mng_data_t *to_mng_data);

/**
 * @brief 十六进制输出数据
 *
 * @param data     数据指针
 * @param data_len 数据长度
 */
void manager_printf_data_hex(unsigned char *data, int data_len);

/**
 * @brief 音频与WIoTa APP交互数据结构体
 *
 */
typedef struct audio_data
{
    unsigned int dev_id;
    unsigned char group_id;
    unsigned char user_number;
    unsigned char frame_count;
    unsigned char first_access;
    unsigned int data_len;
    unsigned char data[0];
} audio_data_t;

/**
 * @brief 网关管理线程发送到serial线程的设备列表结构体
 *
 */
typedef struct online_device_list
{
    unsigned int online_number;
    unsigned int dev_id[0];
} online_device_list_t;

/**
 * @brief  设备状态信息结构体
 *
 */
typedef struct device_status
{
    unsigned int dev_id;
    unsigned int status;
} device_status_t;

#endif /* __INTERACTION_MANAGER_H__ */